<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org" lang="zh-CN">

<div class="container-fluid">
    <div class="row">
        <div class="col-md-12">
            <!-- 插件文档 -->
            <div class="col-md-5">
                <blockquote>
                    <p>插件有什么用？</p>
                    <small class="text-muted">插件是一种可扩展全量同步和增量同步实现数据转换的技术方式。通过插件可以接收同步数据，自定义同步到目标源的行数据，也能消费数据并实现更多业务场景。</small>
                </blockquote>

                <p>如何开发插件？</p>
                <ol>
                    <li>新建java或maven工程，或者下载 <a href="https://gitee.com/ghi/dbsyncer-plugin-demo" title="提供开发者编写插件的示例项目"
                                               target='_blank'>示例项目</a></li>
                    <li>导入开发包：
                        <ul>
                            <li>方式1：导入jar
                                <p><a onClick="downLoad('common')" href="javascript:;" title="下载开发包">dbsyncer-common-[[${version}]].jar</a></p>
                                <p><a onClick="downLoad('connector')" href="javascript:;" title="下载开发包">dbsyncer-connector-[[${version}]].jar</a> (非必须)</p>
                            </li>
                            <li>方式2：引入pom（需要安装到本地）
                                <pre>&lt;dependency&gt;<br/>&nbsp;&nbsp;&lt;groupId>org.ghi&lt;/groupId&gt;<br/>&nbsp;&nbsp;&lt;artifactId>dbsyncer-common&lt;/artifactId&gt;<br/>&nbsp;&nbsp;&lt;version>[[${version}]]&lt;/version&gt;<br/>&lt;/dependency&gt;<br/>&lt;dependency&gt;<br/>&nbsp;&nbsp;&lt;groupId>org.ghi&lt;/groupId&gt;<br/>&nbsp;&nbsp;&lt;artifactId>dbsyncer-connector&lt;/artifactId&gt;<br/>&nbsp;&nbsp;&lt;version>[[${version}]]&lt;/version&gt;<br/>&lt;/dependency&gt;</pre>
                            </li>
                        </ul>
                    </li>
                    <li>
                        <simple>新建一个类，比如MyPlugin，实现接口ConvertService方法</simple>
<pre>package org.test;

import org.dbsyncer.common.spi.ConvertContext;
import org.dbsyncer.common.spi.ConvertService;

public class MyPlugin implements ConvertService {

    /**
     * 全量同步/增量同步
     *
     * @param convertContext
     */
    @Override
    public void convert(ConvertContext convertContext) {
        // TODO 消费或处理数据
        System.out.println("插件消费数据中...");

        // 是否终止同步到目标库开关，默认false
        convertContext.setTerminated(false);

        // 获取Spring上下文，当然也可获取dbs注册的bean对象
        convertContext.getContext();

        // 数据源表和目标源表
        convertContext.getSourceTableName();
        convertContext.getTargetTableName();

        // 捕获的事件（INSERT/UPDATE/DELETE）
        convertContext.getEvent();

        // 数据源和目标源表全量或增量数据
        convertContext.getSourceList();
        convertContext.getTargetList();

        // 获取目标库连接器实例（如果需要用到连接器，必须引入dbsyncer-connector-[[${version}]].jar）
        convertContext.getTargetConnectorMapper();
    }

    /**
     * 全量同步/增量同步完成后执行处理
     *
     * @param context
     */
    @Override
    public void postProcessAfter(ConvertContext context) {
        // 完成同步后调用该方法
    }

    /**
     * 重写方法：设置版本号
     *
     * @return
     */
    @Override
    public String getVersion() {
        return "1.0.0";
    }

    /**
     * 重写方法：设置插件名称
     *
     * @return
     */
    @Override
    public String getName() {
        return "我的插件";
    }
}</pre>
                    </li>
                    <li>
                        <simple>/META-INF/新建services文件夹，并在services下新建一个文件，命名为org.dbsyncer.common.spi.ConvertService，文件写入实现类路径org.test.MyPlugin，如果有多个实现就换行再写入</simple>
                        <p><img draggable="false" th:src="@{'/img/plugin/spi.png'}"></p>
                    </li>
                    <li>
                        <simple>打包jar</simple>
                        <p><img draggable="false" th:src="@{'/img/plugin/jar.png'}"></p>
                    </li>
                </ol>
            </div>

            <!-- 插件列表 -->
            <div class="col-md-7">
                <form id="uploadForm" class="form-horizontal" role="form">
                    <div class="page-header">
                        <h3>上传插件 <small>只支持 "jar" 的文件扩展名.</small></h3>
                    </div>

                    <div class="form-group">
                        <div class="file-loading">
                            <input id="filePlugin" type="file" name="files" multiple="multiple" />
                        </div>
                    </div>

                    <div class="form-group">
                        <table class="table table-hover">
                            <caption>插件列表([[${plugins?.size()} ?: 0]])</caption>
                            <thead>
                            <tr>
                                <th>名称</th>
                                <th>运行驱动</th>
                                <th>类名</th>
                                <th>版本</th>
                                <th>文件</th>
                            </tr>
                            </thead>
                            <tbody id="pluginList">
                            <tr th:id="${p?.name}" th:each="p,state : ${plugins}">
                                <td th:title="内置插件" th:if="${p?.unmodifiable}"><i class="fa fa-plug fa_gray" aria-hidden="true"></i> [[${p?.name}]]</td>
                                <td th:title="普通插件" th:if="${not p?.unmodifiable}"><i class="fa fa-star fa_blueviolet" aria-hidden="true"></i> [[${p?.name}]]</td>
                                <td th:text="${p?.mappingName}"/>
                                <td th:text="${p?.className}"/>
                                <td th:text="${p?.version}"/>
                                <td th:text="${p?.fileName}"/>
                            </tr>
                            </tbody>
                        </table>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>

<script type="text/javascript">
    $("#filePlugin").fileinput({
        theme: 'fas',
        language: 'zh',
        uploadUrl: $basePath + '/plugin/upload',
        enctype: 'multipart/form-data',
        removeFromPreviewOnError: true, //当选择的文件不符合规则时，例如不是指定后缀文件、大小超出配置等，选择的文件不会出现在预览框中，只会显示错误信息
        allowedFileExtensions: ['jar'],
        minFileCount: 0, //每次多次上载允许的最小文件数。如果设置为0，则表示文件数是可选的
        maxFileCount: 5, //表示允许同时上传的最大文件个数 如果设置为0，则表示允许的文件数不受限制
        showPreview: true,
        showUpload: true,//不展示上传按钮
        validateInitialCount: true,//是否在验证minFileCount和包含初始预览文件计数（服务器上载文件）maxFileCount
    }).on("fileuploaded", function(event, data, previewId, index) {
        if (!data.response.success) {
            bootGrowl(data.response.resultValue, "danger");
        }
        doLoader("/plugin");
    });

    function downLoad(fileName){
        window.open($basePath + "/plugin/download?name=" + fileName);
    }
</script>
</html>